package com.yyt.module_main.act;

import android.app.AlertDialog;
import android.content.DialogInterface;
import android.net.Uri;
import android.os.Build;
import android.view.View;
import android.webkit.JavascriptInterface;
import android.webkit.JsPromptResult;
import android.webkit.JsResult;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;

import com.alibaba.android.arouter.facade.annotation.Route;
import com.yyt.libsrc.helper.MsgHelper;
import com.yyt.libsrc.router.RouteTable;
import com.yyt.module_main.R;
import com.yyt.module_main.databinding.ActivityH5PayBinding;

import java.util.HashMap;
import java.util.Set;

import top.lixb.libcommon.base.RefreshableActivity;
import top.lixb.libcommon.log.L;

@Route(path = RouteTable.main_h5_pay)
public class MyH5PayActivity extends RefreshableActivity<ActivityH5PayBinding> {

    private final String url = "";
    private WebView mWebView;
    private WebSettings mSettings;
    private String test = "这是来自安卓的消息";

    @Override
    protected void init() {
        mWebView = mRefreshContentBinding.web;
        mSettings = mWebView.getSettings();
        mSettings.setJavaScriptEnabled(true); //支出js


//设置自适应屏幕，两者合用
        mSettings.setUseWideViewPort(true); //将图片调整到适合webview的大小 
        mSettings.setLoadWithOverviewMode(true); // 缩放至屏幕的大小

//缩放操作
        mSettings.setSupportZoom(true); //支持缩放，默认为true。是下面那个的前提。
        mSettings.setBuiltInZoomControls(true); //设置内置的缩放控件。若为false，则该WebView不可缩放
        mSettings.setDisplayZoomControls(false); //隐藏原生的缩放控件

        //其他细节操作
        mSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK); //关闭webview中缓存
        mSettings.setAllowFileAccess(true); //设置可以访问文件 
        mSettings.setJavaScriptCanOpenWindowsAutomatically(true); //支持通过JS打开新窗口 
        mSettings.setLoadsImagesAutomatically(true); //支持自动加载图片
        mSettings.setDefaultTextEncodingName("utf-8");//设置编码格式

        
        mWebView.canGoBack();
        // 特别注意：5.1以上默认禁止了https和http混用，以下方式是开启
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            mWebView.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
        }
        mWebView.addJavascriptInterface(new AndroidtoJs(),"callAndroid");
        mWebView.loadUrl("file:///android_asset/jstest.html");
        mWebView.setWebViewClient(new WebViewClient());

        mRefreshContentBinding.btnAndroid.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mWebView.post(new Runnable() {
                    @Override
                    public void run() {
                        mWebView.loadUrl("javascript:callJS()");
                    }
                });
            }
        });

        // 由于设置了弹窗检验调用结果,所以需要支持js对话框
        // webview只是载体，内容的渲染需要使用webviewChromClient类去实现
        // 通过设置WebChromeClient对象处理JavaScript的对话框
        //设置响应js 的Alert()函数
        mWebView.setWebChromeClient(new WebChromeClient() {
            @Override
            public boolean onJsAlert(WebView view, String url, String message, final JsResult result) {
                AlertDialog.Builder b = new AlertDialog.Builder(MyH5PayActivity.this);
                b.setTitle("Alert");
                b.setMessage(message);
                b.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        result.confirm();
                    }
                });
                b.setCancelable(false);
                b.create().show();
                return true;
            }

            @Override
            public boolean onJsConfirm(WebView view, String url, String message, JsResult result) {
                return super.onJsConfirm(view, url, message, result);
            }

            @Override
            public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result) {
                // 根据协议的参数，判断是否是所需要的url(原理同方式2)
                // 一般根据scheme（协议格式） & authority（协议名）判断（前两个参数）
                //假定传入进来的 url = "js://webview?arg1=111&arg2=222"（同时也是约定好的需要拦截的）
                L.e("url="+url+",message="+message);
                Uri uri = Uri.parse(message);
                // 如果url的协议 = 预先约定的 js 协议
                // 就解析往下解析参数
                if ( uri.getScheme().equals("js")) {

                    // 如果 authority  = 预先约定协议里的 webview，即代表都符合约定的协议
                    // 所以拦截url,下面JS开始调用Android需要的方法
                    if (uri.getAuthority().equals("webview")) {

                        //
                        // 执行JS所需要调用的逻辑
                        L.e("js调用了Android的方法");
                        // 可以在协议上带有参数并传递到Android上
                        HashMap<String, String> params = new HashMap<>();
                        Set<String> collection = uri.getQueryParameterNames();

                        //参数result:代表消息框的返回值(输入值)
                        result.confirm("js调用了Android的方法成功啦");
                    }
                    return true;
                }

                return super.onJsPrompt(view, url, message, defaultValue, result);
            }
        });



    }



    public class AndroidtoJs extends Object{

        @JavascriptInterface
        public String hello(String msg) {
            MsgHelper.showToast(msg);
            return "来自安卓的消息:" + msg;
        }

    }

    @Override
    protected int initRefreshLayout() {
        return R.layout.activity_h5_pay;
    }

    @Override
    protected void getData(boolean refresh) {

    }

}
